import axios, { AxiosInstance, AxiosResponse } from 'axios';
import { API_BASE_URL, REQUEST_TIMEOUT } from './apiConfig';
import toastService from './toastService';

// 创建axios实例
export const axiosInstance: AxiosInstance = axios.create({
  baseURL: API_BASE_URL,
  timeout: REQUEST_TIMEOUT,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 注意：开发环境的代理转换拦截器已被禁用
// 现在API请求将直接指向配置的8080端口
// 如果遇到跨域问题，请考虑启用下面的代码
// 用于开发环境的代理转换拦截器
// 使用process.env.NODE_ENV替代import.meta.env.DEV，避免类型问题
// if (process.env.NODE_ENV === 'development') {
//   axiosInstance.interceptors.request.use(
//     (config: any): any => {
//       // 检查baseURL是否是指向localhost:8080的开发环境地址
//       if (config.baseURL && config.baseURL.includes('localhost:8080')) {
//         // 转换为使用Vite代理的相对路径
//         config.baseURL = '';
//         // 确保请求URL以/api开头
//         if (config.url && !config.url.startsWith('/api')) {
//           config.url = '/api' + (config.url.startsWith('/') ? '' : '/') + config.url;
//         }
//       }
//       return config;
//     },
//     (error) => {
//       return Promise.reject(error);
//     }
//   );
// }

// 请求拦截器
axiosInstance.interceptors.request.use(
  (config: any): any => {
    // 获取用户token
    const token = localStorage.getItem('authorization');
    
    // 如果有token，添加到请求头
    if (token) {
      config.headers = config.headers || {};
      config.headers['Authorization'] = token;
    }
    
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
  (response: AxiosResponse): AxiosResponse => {
    // 保留原始响应数据，不做额外处理，让业务层自己处理
    // 这样可以更好地与API文档中的统一响应格式保持一致
    return response;
  },
  (error): Promise<never> => {
    // 处理错误响应
    if (error.response) {
      // 服务器返回错误状态码
      switch (error.response.status) {
        case 401:
          // 未授权，清除用户登录状态并跳转登录页
          // logout();
          if (window.location.pathname !== '/login') {
            window.location.href = '/login';
          }
          break;
        case 403:
        case 404:
        case 500:
        default:
          // 只显示后端返回的msg内容
          if (error.response.data?.msg) {
            toastService.error(error.response.data.msg);
          }
          break;
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应（前端特有错误）
      toastService.error('网络错误，请检查您的网络连接');
    } else {
      // 请求配置出错（前端特有错误）
      toastService.error('请求配置错误: ' + error.message);
    }
    
    return Promise.reject(error);
  }
);

export default axiosInstance;